package E_2024;

import java.util.*;

/*
题目描述
    现有两门选修课，每门选修课都有一部分学生选修，每个学生都有选修课的成绩，
    需要你找出同时选修了两门选修课的学生，先按照班级进行划分，班级编号小的先输出，
    每个班级按照两门选修课成绩和的降序排序，成绩相同时按照学生的学号升序排序。
输入
    第一行为第一门选修课学生的成绩，
    第二行为第二门选修课学生的成绩，
    每行数据中学生之间以英文分号分隔，
    每个学生的学号和成绩以英文逗号分隔，
    学生学号的格式为8位数字(2位院系编号+入学年份后2位+院系内部1位专业编号+所在班级3位学号),
    学生成绩的取值范围为 [0,100] 之间的整数，两门选修课选修学生数的取值范围为 [1-2000] 之间的整数。

输出

    同时选修了两门选修课的学生的学号，如果没有同时选修两门选修课的学生输出 NULL,
    否则，先按照班级划分，班级编号小的先输出，每个班级先输出班级编号(学号前五位),
    然后另起一行输出这个班级同时选修两门选修课的学生学号，学号按照要求排序(按照两门选修课成绩和的降序，成绩和相同时按照学号升序),学生之间以英文分号分隔。
例：https://pic3.zhimg.com/v2-8cfbf3eddfa4538b6960cd097ebb3a98_r.jpg
 */
public class E_100_53 {
    public static void main(String[] args) {
        String a = "1202021,75,01201033,95,01202008,80,01203006,90,01203088,100";
        String b = "01202008,70,01203088,85,01202111,80,01202021,75,01201100,88";
        Long[] A = Arrays.stream(a.split(",")).map(Long::parseLong).toArray(Long[]::new);
        Long[] B = Arrays.stream(b.split(",")).map(Long::parseLong).toArray(Long[]::new);
        ans(A, B);
    }
    public static void ans(Long[] sourceA, Long[] sourceB){
        // map记录A课程分数情况
        Map<Long,Long> Amap = new HashMap<>();
        for (int i = 0; i < sourceA.length; i++) {
            Amap.put(sourceA[i++],sourceA[i]);
        }
        // 两门课程学生集合
        List<Long[]> students = new ArrayList<>();
        // B课程有分数的同学，若Amap中有，说明选修两门课程
        for (int i = 0; i < sourceB.length; i++) {
            if (Amap.containsKey(sourceB[i]))
                students.add(new Long[]{sourceB[i],Amap.get(sourceB[i])+sourceB[++i]});
        }
        if (students.size() < 1){
            System.out.println("NULL");
            return;
        }
        students.sort((a,b)->{
            long x = a[0]/1000;
            long y = b[0]/1000;
            if (x != y) return Math.toIntExact(x - y);
            else if (!Objects.equals(a[1], b[1])){
                return a[1].compareTo(b[1]);
            }else {
                return a[0].compareTo(b[0]);
            }
        });
        long cls = -1;
        for (Long[] student : students) {
            Long x = student[0]/1000;
            if (x != cls) {
                System.out.println(x);
                cls = x;
            }
            System.out.println(student[0]+";");
        }
    }
}
